package main

import (
	"fmt"
	"math"
	"sort"
	"strings"
	"time"
)

// 1. 实现对圆形、三角形、长方形求面积
type PlaneGrapher interface {
	Area() float64
}

type Circular struct {
	Radius float64
}

func (c *Circular) Area() float64 {
	// return c.Radius * c.Radius * math.Pi
	return math.Pi * math.Pow(c.Radius, 2)
}

type Rectangle struct {
	Longth, Wideth float64
}

func (r *Rectangle) Area() float64 {
	return r.Longth * r.Wideth
}

type Triangle struct {
	Bottom, Height float64
}

func (t *Triangle) Area() float64 {
	return t.Bottom * t.Height / 2
}

func NewPlaneGraph(p PlaneGrapher) float64 {
	return p.Area()
}

//2. 利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列

type Graphical struct {
	name string
	area float64
}

//3. 分析斐波那契数列递推公式递归版本的问题，试着为该函数提供一个Cache，使其计算效率提升
// 1、1、2、3、5、8、13、21、34……

var cache = make(map[int]int)

func fib(n int) int {
	if v, ok := cache[n]; ok {
		return v
	}
	if n <= 2 {
		return 1
	}
	res := fib(n-1) + fib(n-2)
	cache[n] = res
	return res
}

/*
4、8年前的今天上午9点30分
要求：
	1. 毫秒时间戳是多少？
	2. 格式化输出时间为 2005/09/10 21:35:40 +0800 的形式
	3. 请问那天是周几？到那天，本年已经过了多少周？
	4. 距离今天已经过了多少天了？
*/

func timeHomework() {
	now := time.Now().Local()
	// fmt.Println(now)
	t1 := now.AddDate(-8, 0, 0)
	t2 := time.Date(t1.Year(), t1.Month(), t1.Day(), 9, 30, 0, 0, time.Local)
	fmt.Printf("8年前的今天上午9点30分是: %v\n", t2)
	fmt.Printf("毫秒时间戳是: %v\n", t2.UnixMicro())
	fmt.Printf("格式化输出时间为 2005/09/10 21:35:40 +0800 的形式: %v\n", t2.Format("2006/01/02 15:04:05 -0700"))
	fmt.Printf("请问那天是周 %v ,到那天，本年已经过了%v周\n", t2.Weekday(), t2.YearDay()/7)
	fmt.Printf("距离今天已经过了%v天\n", int(now.Sub(t2).Seconds()/60/60/24))
}

func main() {
	fmt.Println(strings.Repeat("~~~作业1~~~", 5))
	c1 := Circular{2}
	r1 := Rectangle{2, 3}
	t1 := Triangle{2, 3}
	// PlaneGrapherSlient := []PlaneGrapher{&c1, &r1, &t1}
	fmt.Printf("圆形的面积是：%.2f\n", NewPlaneGraph(&c1))
	fmt.Printf("长方形的面积是：%.2f\n", NewPlaneGraph(&r1))
	fmt.Printf("三角形的面积是：%.2f\n", NewPlaneGraph(&t1))

	fmt.Println(strings.Repeat("~~~作业2~~~", 5))
	var grapslient = []Graphical{}
	grapslient = append(grapslient, Graphical{"圆形", NewPlaneGraph(&c1)})
	grapslient = append(grapslient, Graphical{"三角形", NewPlaneGraph(&t1)})
	grapslient = append(grapslient, Graphical{"长方形", NewPlaneGraph(&r1)})
	fmt.Printf("排序前: %v\n", grapslient)
	sort.Slice(grapslient, func(i, j int) bool {
		return grapslient[i].area > grapslient[j].area
	})
	fmt.Printf("排序后: %v\n", grapslient)

	fmt.Println(strings.Repeat("~~~作业3~~~", 5))
	fmt.Println(fib(100))

	fmt.Println(strings.Repeat("~~~作业4~~~", 5))
	timeHomework()

}

// 阿飞老师的批改
// 几个题目思维逻辑都非常清晰，完成的也非常不错，但是还存在两个小问题
// 1. 输出原型面积的适合尽量限制一下小数精度，这样看起来更友好；
// 2. 最后一个题目中没有导入time模块，导致程序执行失败，
//    正常来说自动保存时会帮你自动补全，不知道你这里是怎么遗漏的；
